/*
 *   项目名称：rpc-demo
 *   文件名称：com.xiaolon.rpc.RpcApplication
 *
 *   创建人：  ZHOU XIAO LONG
 *   创建日期：2024/12/4
 *
 */
package com.xiaolon.rpc;

import com.xiaolon.rpc.config.RegistryConfig;
import com.xiaolon.rpc.config.RpcConfig;
import com.xiaolon.rpc.constant.RpcConstant;
import com.xiaolon.rpc.registry.Registry;
import com.xiaolon.rpc.registry.RegistryFactory;
import com.xiaolon.rpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * 类描述： RpcApplication
 * 相当于holder，存放全局环境变量
 **/
@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;

    /**
     * 框架初始化，支持传入自定义配置
     */
    public static void init(RpcConfig newRpcConfig){
        rpcConfig = newRpcConfig;
        log.info("init RPC config: "+newRpcConfig.toString());

        // 注册中心初始化
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
        registry.init(registryConfig);
        log.info("registry init, config={}", registryConfig);

        // 创建并注册Shutdown Hook，JWM退出时执行
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 默认初始化
     */
    public static void init(){
        RpcConfig newRpcConfig;
        try {
            newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        }catch (Exception e){
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 获取配置
     * @return
     */
    public static RpcConfig getRpcConfig(){
        if(rpcConfig == null){
            synchronized (RpcApplication.class){
                if(rpcConfig==null) init();
            }
        }
        return rpcConfig;

    }
}